home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / grafik / converter / limbo4.0 / src / 2d / mapgfx.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-16  |  7.1 KB  |  248 lines

  1. #include "includes.h"
  2.  
  3.  int Quiet=FALSE;
  4.  
  5.  
  6.  void MapUsage()
  7.   {
  8.    printf("\nMapGfx - Mapping operations for bitmaps");
  9.    printf("\nUsage: mapgfx [-options] <command> <infile> <outfile>");
  10.    printf("\n\nCommands:");
  11.    printf("\n m     Map 2D image to 3D");
  12.    printf("\n r     Remap 3D sequence to 2D");
  13.    printf("\n p     Convert pgm to ppm");
  14.    printf("\n c     Calc PSNR");
  15.    printf("\n\nOptions:\n");
  16.    printf("\n -d<n>    Maximum 'x' size");
  17.    printf("\n -b<n>    Maximum 'y' size");
  18.    printf("\n -t<n>    Mapping type: 1=plain collage");
  19.    printf("\n                        2=Morton order");
  20.    printf("\n -q       Be quiet");
  21.    
  22.    MyExit(0);
  23.   }
  24.  
  25.  BitMap3D *MortonOrder(BitMap3D *Img)
  26.   {
  27.    register unsigned int i,j,k,l;
  28.    BitMap3D *Dst=GimmeABitMap3D(Img->XSize>>1,Img->YSize>>1,Img->ZSize<<2,Img->ImgType);
  29.    static level=0;
  30.    
  31.    for(i=0;i<Dst->XSize;i++)
  32.    for(j=0;j<Dst->YSize;j++)
  33.     {
  34.      for(k=0;k<Img->ZSize;k++) Dst->Map[i][j][0*Img->ZSize+k]=Img->Map[(i<<1)  ][(j<<1)  ][k];
  35.      for(k=0;k<Img->ZSize;k++) Dst->Map[i][j][1*Img->ZSize+k]=Img->Map[(i<<1)+1][(j<<1)  ][k];
  36.      for(k=0;k<Img->ZSize;k++) Dst->Map[i][j][2*Img->ZSize+k]=Img->Map[(i<<1)  ][(j<<1)+1][k];
  37.      for(k=0;k<Img->ZSize;k++) Dst->Map[i][j][3*Img->ZSize+k]=Img->Map[(i<<1)+1][(j<<1)+1][k];
  38.     }
  39.    FreeMeABitMap3D(Img);
  40.    return Dst;
  41.   }
  42.  
  43.  BitMap3D *DeMortonOrder(BitMap3D *Img)
  44.   {
  45.    register unsigned int i,j,k,l;
  46.    BitMap3D *Dst=GimmeABitMap3D(Img->XSize<<1,Img->YSize<<1,Img->ZSize>>2,Img->ImgType);
  47.    
  48.    for(i=0;i<Img->XSize;i++)
  49.    for(j=0;j<Img->YSize;j++)
  50.     {
  51.      for(k=0;k<Dst->ZSize;k++) Dst->Map[(i<<1)  ][(j<<1)  ][k]=Img->Map[i][j][0*Dst->ZSize+k];
  52.      for(k=0;k<Dst->ZSize;k++) Dst->Map[(i<<1)+1][(j<<1)  ][k]=Img->Map[i][j][1*Dst->ZSize+k];
  53.      for(k=0;k<Dst->ZSize;k++) Dst->Map[(i<<1)  ][(j<<1)+1][k]=Img->Map[i][j][2*Dst->ZSize+k];
  54.      for(k=0;k<Dst->ZSize;k++) Dst->Map[(i<<1)+1][(j<<1)+1][k]=Img->Map[i][j][3*Dst->ZSize+k];
  55.     }
  56.    FreeMeABitMap3D(Img);
  57.    return Dst;
  58.   }
  59.  
  60.  void main(int argc,char *argv[])
  61.   {
  62.    char c;
  63.    char *filename1,*filename2,*cmd,*dd;
  64.    int block=2,depth=8,type=1,i;
  65.    
  66.    Quiet=FALSE;
  67.    
  68.    if (argc<4) MapUsage();
  69.    while(--argc>3)
  70.     {
  71.      c=(*++argv)[0];
  72.      if (!(c=='-')) ErrorHandler(UNKNOWN_OPTION,argv[0]);
  73.      else
  74.       {
  75.        c=(*argv)[1];
  76.        dd= &(*argv)[1];
  77.        switch(c)
  78.         {
  79.          case 't': type=ReadInteger(&((*argv)[2]));
  80.          break;
  81.          case 'b': block=ReadInteger(&((*argv)[2]));
  82.          break;
  83.          case 'd': depth=ReadInteger(&((*argv)[2]));
  84.          break;
  85.          case 'q': Quiet=TRUE;
  86.          break;
  87.          default: ErrorHandler(UNKNOWN_OPTION,argv[0]);
  88.          break;
  89.         }
  90.       }
  91.     }
  92.    
  93.    cmd = &(*++argv)[0];
  94.    filename1 = &(*++argv)[0];
  95.    filename2 = &(*++argv)[0];
  96.    
  97.    c=cmd[0];
  98.    switch(c)
  99.     {
  100.      case 'm': /* convert 2D image to 3D */
  101.       {
  102.        BitMap *Src;
  103.        vpf(stderr,"Converting  bitmap '%s' to sequence '%s'...",filename1,filename2);
  104.        Src=LoadBitMap(filename1,0,0,0,0,1,""); /* load image */
  105.        
  106.        switch(type)
  107.         {
  108.          case 1: /* dum conversion - just plain collage */
  109.           {
  110.            BitMap *Tmp;
  111.            BitMap3D *Dst;
  112.            register int x,y,z,i,j,k=0;
  113.  
  114.            vpf(stderr,"\nMapping of 2D image to 3D useing plain collage");
  115.            
  116.            x=(Src->XSize/block)*block/depth;
  117.            y=(Src->YSize/block)*block/depth;
  118.            z=depth<<2;
  119.            
  120.            Dst=GimmeABitMap3D(x,y,z,Src->ImgType);
  121.            Tmp=GimmeABitMap(x,y,Src->ImgType);
  122.            vpf(stderr,"New image size:(%d,%d,%d)",x,y,z);
  123.            
  124.            for(i=0;i<(Src->XSize/block)*block/x;i++)
  125.            for(j=0;j<(Src->YSize/block)*block/y;j++)
  126.             {
  127.              Map2BitMap(Src,Tmp,i*x,j*y);
  128.              BitMap2Frame(Tmp,Dst,k++);
  129.             }
  130.            SaveBitMap3D(filename2,Dst,"");
  131.           }
  132.          break;
  133.          case 2: /* Morton order */
  134.           {
  135.            BitMap *Tmp;
  136.            BitMap3D *Dst;
  137.            register int x,y,z,i,j,k=0;
  138.            
  139.            vpf(stderr,"\nMapping of 2D image to 3D useing Morton Order...");
  140.            x=(Src->XSize/(1<<block))*(1<<block);
  141.            y=(Src->YSize/(1<<block))*(1<<block);
  142.            z=depth;
  143.            vprintf(stderr,"\n   Depth:%d",z);
  144.            Dst=GimmeABitMap3D(x,y,1,Src->ImgType);
  145.            BitMap2Frame(Src,Dst,0); /* copy frame to 3d map */
  146.            FreeMeABitMap(Src);
  147.            
  148.            for(i=0;i<z;i++) 
  149.             {
  150.              vpf(stderr,"\n   Level:%d  Image:(%d,%d,%d)",i,Dst->XSize,Dst->YSize,Dst->ZSize);
  151.              Dst=MortonOrder(Dst);
  152.             }
  153.            vpf(stderr,"\n   Level:%d  Image:(%d,%d,%d)",i,Dst->XSize,Dst->YSize,Dst->ZSize);
  154.            SaveBitMap3D(filename2,Dst,"");
  155.           }
  156.          break;
  157.          default:
  158.          break;
  159.         }
  160.        vprintf(stderr,"\n");
  161.        exit(0); 
  162.       }
  163.      break;
  164.      
  165.      case 'r':  /* reconvert 3D image to 2D */
  166.       {
  167.        BitMap3D *Src;
  168.        vpf(stderr,"\nConverting  sequence '%s' to bitmap '%s'...",filename1,filename2);
  169.        Src=LoadBitMap3D(filename1,0,0,0,0,0,1,""); /* load image */
  170.        
  171.        switch(type)
  172.         {
  173.          case 2: /* Morton order */
  174.           {
  175.            BitMap *Dst;
  176.            register int x,y,z,i,j,k=0;
  177.  
  178.            vpf(stderr,"\nRe-mapping of 3D image to 2D useing Morton Order...");
  179.            /* z=(int)(sqrt(Src->ZSize)+0.5)>>1; */
  180.            for(i=0;i<z;i++) 
  181.             {
  182.              vpf(stderr,"\n   Level:%d  Image:(%d,%d,%d)",i,Src->XSize,Src->YSize,Src->ZSize);
  183.              Src=DeMortonOrder(Src);
  184.             }
  185.            vpf(stderr,"\n   Level:%d  Image:(%d,%d,%d)",i,Src->XSize,Src->YSize,Src->ZSize);
  186.            Dst=GimmeABitMap(Src->XSize,Src->YSize,GRAYIMG);
  187.            Frame2BitMap(Src,0,Dst);
  188.            SaveBitMap(filename2,Dst,"");
  189.           }
  190.          break;
  191.          default:
  192.          break;
  193.         }
  194.        vprintf(stderr,"\n");
  195.        exit(0); 
  196.       }
  197.      break;
  198.      
  199.      case 'p':  /* pgm file to ppm */
  200.       {
  201.        BitMap *Src;
  202.        BitMap *Dst;
  203.        register unsigned int i,j,k,l;
  204.        
  205.        vprintf(stderr,"Converting PGM file '%s' to PPM file '%s'...",filename1,filename2);
  206.  
  207.        Quiet=TRUE;
  208.        Src=LoadBitMap(filename1,0,0,0,0,1,""); /* load image */
  209.        if (Src->ImgType!=GRAYIMG) ErrorHandler(WRONG_FORMAT,"Not a PGM file");
  210.        Dst=GimmeABitMap(Src->XSize,3*Src->YSize,RGBIMG);
  211.        l=Src->YSize;
  212.        
  213.        for(i=0;i<Src->XSize;i++)
  214.        for(j=0;j<Src->YSize;j++)
  215.         {
  216.          k=(Src->Map[i][j]);
  217.          Dst->Map[i][j]    =k;
  218.          Dst->Map[i][j+l]  =k;
  219.          Dst->Map[i][j+l*2]=k;
  220.         }
  221.        
  222.        SaveBitMap(filename2,Dst,"");
  223.        
  224.        vprintf(stderr,"\nDone!\n");
  225.       }
  226.      break;
  227.  
  228.      case 'c':  /* calc psnr */
  229.       {
  230.        BitMap *Src;
  231.        BitMap *Dst;
  232.        register unsigned int i,j,k,l;
  233.   
  234.        vprintf(stderr,"PSNR between '%s' and %s'...",filename1,filename2);
  235.  
  236.        Src=LoadBitMap(filename1,0,0,0,0,1,""); /* load image */
  237.        Dst=LoadBitMap(filename2,0,0,0,0,1,""); /* load image */
  238.        vprintf(stderr,"\nPSNR: %f [dB]",PSNR(Src,Dst));
  239.      
  240.        vprintf(stderr,"\nDone!\n");
  241.       }
  242.      break;
  243.     }
  244.    
  245.   }
  246.  
  247.  
  248.